package com.emerquim.bean.backing;

import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;

import com.emerquim.bean.model.Entidad;
import com.emerquim.persistence.dao.PermisosUsuario;
import com.emerquim.persistence.dao.PermisosUsuarioDAO;
import com.emerquim.persistence.dao.Usuarios;
import com.emerquim.persistence.dao.UsuariosDAO;
import com.icesoft.faces.context.effects.JavascriptContext;

public class Usuario {

	/**
	 * Declaracion de los miembros de la clase
	 */
	UsuariosDAO nuevoUsuarioDAO;
	Usuarios nuevoUsuario;
	private boolean usuarioHabilitado;

	/**
	 * Declaracion de miembros para permisiso de usuario
	 */
	private boolean rolMedico;
	private boolean rolAdmin;
	private boolean rolAsesor;

	/**
	 * @return the nuevoUsuario
	 */
	public Usuarios getNuevoUsuario() {
		return nuevoUsuario;
	}

	/**
	 * @param nuevoUsuario
	 *            the nuevoUsuario to set
	 */
	public void setNuevoUsuario(Usuarios nuevoUsuario) {
		this.nuevoUsuario = nuevoUsuario;
	}

	/**
	 * @return the usuarioHabilitado
	 */
	public boolean isUsuarioHabilitado() {
		return usuarioHabilitado;
	}

	/**
	 * @param usuarioHabilitado
	 *            the usuarioHabilitado to set
	 */
	public void setUsuarioHabilitado(boolean usuarioHabilitado) {
		this.usuarioHabilitado = usuarioHabilitado;
	}

	/**
	 * @return the rolMedico
	 */
	public boolean isRolMedico() {
		return rolMedico;
	}

	/**
	 * @param rolMedico
	 *            the rolMedico to set
	 */
	public void setRolMedico(boolean rolMedico) {
		this.rolMedico = rolMedico;
	}

	/**
	 * @return the rolAdmin
	 */
	public boolean isRolAdmin() {
		return rolAdmin;
	}

	/**
	 * @param rolAdmin
	 *            the rolAdmin to set
	 */
	public void setRolAdmin(boolean rolAdmin) {
		this.rolAdmin = rolAdmin;
	}

	/**
	 * @return the rolAsesor
	 */
	public boolean isRolAsesor() {
		return rolAsesor;
	}

	/**
	 * @param rolAsesor
	 *            the rolAsesor to set
	 */
	public void setRolAsesor(boolean rolAsesor) {
		this.rolAsesor = rolAsesor;
	}

	public Usuario() {
		super();
		this.inicializarNuevoUsuario();
	}

	/**
	 * Funcionalidad de log
	 */
	private static final Logger log = Logger.getLogger(Entidad.class);

	public void inicializarNuevoUsuario() {
		this.nuevoUsuarioDAO = new UsuariosDAO();
		this.nuevoUsuario = new Usuarios();
		this.nuevoUsuario.setUsuario(null);
		this.nuevoUsuario.setClave(null);
		this.nuevoUsuario.setPrimerNombre(null);
		this.nuevoUsuario.setSegundoNombre(null);
		this.nuevoUsuario.setPrimerApellido(null);
		this.nuevoUsuario.setSegundoApellido(null);
		this.nuevoUsuario.setTelefono(null);
		this.nuevoUsuario.setMovil(null);
		this.nuevoUsuario.setCorreo(null);
		this.nuevoUsuario.setEnabled(0);
		this.usuarioHabilitado = false;
		this.rolAdmin = false;
		this.rolAsesor = false;
		this.rolMedico = false;
	}

	/**
	 * Metodo para Guardar un Usuario
	 */
	public void guardarUsuario() {
		Usuarios usuario;

		try {

			usuario = this.nuevoUsuario;
			if (this.usuarioHabilitado)
				usuario.setEnabled(1);
			nuevoUsuarioDAO.getSession().beginTransaction();
			if (this.nuevoUsuario.getIdUsuario() == 0)
				nuevoUsuarioDAO.llamarFuncionInsertarUsuario(usuario);

			nuevoUsuarioDAO.getSession().getTransaction().commit();
			this.asignarRoles();

		} catch (HibernateException he) {
			log.error("Error al guardar un usuario en base de datos");
			he.printStackTrace();
		} finally {
			this.nuevoUsuarioDAO.getSession().close();
		}
	}

	public void asignarRoles() {

		Usuarios usuario;
		PermisosUsuario permisosUsuario;
		PermisosUsuarioDAO permisosUsuarioDAO = new PermisosUsuarioDAO();
		try {
			usuario = this.nuevoUsuario;
			permisosUsuario = new PermisosUsuario();
			usuario = (Usuarios) this.nuevoUsuarioDAO.findByUsuario(usuario.getUsuario()).get(0);
			if (this.rolAdmin) {
				permisosUsuario.setUsuarios(usuario);
				permisosUsuario.setPermiso("ROLE_ADMIN");
				permisosUsuarioDAO.getSession().beginTransaction();
				permisosUsuarioDAO.save(permisosUsuario);
				permisosUsuarioDAO.getSession().getTransaction().commit();
			}
			if (this.rolAsesor) {
				permisosUsuario.setUsuarios(usuario);
				permisosUsuario.setPermiso("ROLE_ASESOR");
				permisosUsuarioDAO.getSession().beginTransaction();
				permisosUsuarioDAO.save(permisosUsuario);
				permisosUsuarioDAO.getSession().getTransaction().commit();
			}
			if (this.rolMedico) {
				permisosUsuario.setUsuarios(usuario);
				permisosUsuario.setPermiso("ROLE_MEDICO");
				permisosUsuarioDAO.getSession().beginTransaction();
				permisosUsuarioDAO.save(permisosUsuario);
				permisosUsuarioDAO.getSession().getTransaction().commit();
			}
			this.nuevoUsuario.setIdUsuario(usuario.getIdUsuario());
			this.enviarMensajeUsuario("El Usuario se guardo satisfactoriamente.");
		} catch (HibernateException he) {
			log.error("Error al guardar un usuario en base de datos");
			System.out.print("Error  ????");
			he.printStackTrace();
		} finally {
			permisosUsuarioDAO.getSession().close();
		}
	}

	/**
	 * Metodo para enviar un mensaje de alerta el usuario
	 * 
	 * @param mensaje
	 * @author Felipe Criales
	 */
	private void enviarMensajeUsuario(String mensaje) {
		String funcion = "alert('" + mensaje + "');";
		JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), funcion);
	}
}
